Nix Store
Localで、install済みのnixのpackageが置かれる場所のことのことをNix Storeと呼ぶ
通常は/nix/storeにある
配下にめちゃくちゃたくさんのdirやfileがある
$ ls /nix/store | grep hogeとかで探せる
packageやprofileが全て並列に配置されている
そのため、package間に依存があっても兄弟を見るだけで済む
Nix Store内で管理されているもの
install済みのpackage
同一packageでも異なるversionのものは互いに干渉せず独立に並列にstore下に配置されている
厳密には「異なるversion」ではなく「異なるhash」のものである
同じversionでもhashが異なるものがたまにあるらしいmrsekut.icon
例えばmrsekut.iconのlocalで以下を実行してみると
同じversionのexaが2つ存在する
code:bash
$ ls /nix/store/*exa*/bin
/nix/store/8yawf1v4fbi3xab9r3cs85i5y6dclr99-exa-0.10.1/bin:
exa
/nix/store/fidnwrf9kk9b3pqvdg7wvpgnvkfjq3pc-exa-0.10.1/bin:
exa
User environments
Store配下にあるのはhash-nameという形式のもの ref 例えば/nix/store/s4zia7hhqkin1di0f187b79sa2srhv6k-bash-4.2-p45/
これはdirectoryであり、bin/bashを含んでいる
binだけなく、ソースコードや、その依存、compiler flagを含んでいたりもする
bin/bashが、store直下ではなく、hash-nameの下にあるのがポイント
storeには、self-containedなbuild出力のみがある
実際にはbashを実行すると、hash-name/bin/bashが呼ばれる
この辺のpathの解決もnixがよしなにやってくれる
同一packageでもversionが異なるものは異なるモノとしてstoreに置かれる
s4zia7...hv6k-bash-4.2-p45/の4.2のようなversion番号は、
derivationの名前であって、それがuniqueであるという意味ではないことに注意
uniqueなことに意味があるのはhashの方だけ
https://nixos.org/manual/nix/stable/figures/user-environments.png https://nixos.org/manual/nix/stable/#sec-profiles
subversionのv1.1.2とv1.1.3があるが、それらは並列に配置されている
commandのoptionとか
nix storeから不要なものを削除する
--query, -q
--requisites, -R
$ nix-store -qR
--references \`which exa\`
説明を読んでもいまいちよくわからないmrsekut.icon
こういう結果が得られたとして何を意味するんだ
code:result
$ nix-store -q --references which hello
/nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27
/nix/store/58r35bqb4f3lxbnbabq718svq9i2pda3-hello-2.10
どのコマンドで試してみても同じ結果になるのはhome-managerを使っているから #?? --referrers \`which exa\`
このexaが使われている場所を表示する
結果に表示されるものが、exaに依存していることを表す
tree viewer